home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-05-04 | 3.5 KB | 119 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- StampElems
- Alloc
- 4 May 95
- ParcElems
- Alloc
- Syntax10i.Scn.Fnt
- MODULE Clipboard; (** mf / mah 29.8.94 (
- IMPORT Kernel, Texts, TextFrames, Macintosh, Oberon, MenuViewers, Viewers, Fonts;
- TYPE
- Scrap=POINTER TO ScrapDesc;
- ScrapDesc=RECORD (Texts.TextDesc) (* extension of standard TextDesc in order to keep track of changes *)
- changed: BOOLEAN
- END;
- scrap: Scrap; ClipB: Texts.Buffer; M: Oberon.CopyOverMsg; W: Texts.Writer;
- PROCEDURE ConvertCharFromOberon (VAR ch: CHAR);
- BEGIN
- CASE ch OF
- ': ch := CHR (138)
- | '
- ': ch := CHR (154)
- | '
- ': ch := CHR (159)
- (* | '
- ': ch := CHR (128) *)
- | '
- ': ch := CHR (133)
- | '
- ': ch := CHR (134)
- ELSE
- END
- END ConvertCharFromOberon;
- PROCEDURE ConvertCharToOberon (VAR ch: CHAR);
- BEGIN
- CASE ORD (ch) OF
- 138: ch := '
- | 154: ch := '
- | 159: ch := '
- (* | 128: ch := '
- | 133: ch := '
- | 134: ch := '
- ELSE
- END
- END ConvertCharToOberon;
- PROCEDURE Cut*;
- VAR t: Texts.Text; beg, end, time: LONGINT;
- BEGIN
- Texts.Delete (scrap, 0, scrap.len);
- Oberon.GetSelection (t, beg, end, time);
- IF time >= 0 THEN Texts.Save (t, beg, end, ClipB); Texts.Delete (t, beg, end); Texts.Append (scrap, ClipB) END;
- END Cut;
- PROCEDURE Copy*;
- VAR t: Texts.Text; beg, end, time: LONGINT;
- BEGIN
- Texts.Delete (scrap, 0, scrap.len);
- Oberon.GetSelection (t, beg, end, time);
- IF time >= 0 THEN Texts.Save(t, beg, end, ClipB); Texts.Append(scrap, ClipB) END
- END Copy;
- PROCEDURE Paste*;
- BEGIN
- IF scrap.len > 0 THEN
- M.text:=scrap; M.beg:=0; M.end:=scrap.len;
- Oberon.FocusViewer.handle (Oberon.FocusViewer, M)
- END
- END Paste;
- PROCEDURE Show*;
- VAR V: Viewers.Viewer; X, Y: INTEGER;
- BEGIN
- Oberon.AllocateUserViewer (Oberon.Par.vwr.X, X, Y);
- V:=MenuViewers.New (TextFrames.NewMenu ("Clipboard", "^Edit.Menu.Text"),
- TextFrames.NewText (scrap, 0), TextFrames.menuH, X, Y)
- END Show;
- PROCEDURE* Import;
- VAR run: ARRAY 1024 OF CHAR; i, len: INTEGER; fname: ARRAY 32 OF CHAR;
- BEGIN
- IF Macintosh.convertClip THEN
- Texts.Delete (scrap, 0, scrap.len);
- Macintosh.GetScrap; Macintosh.GetRun (run, len, fname);
- WHILE len > 0 DO
- Texts.SetFont (W, Fonts.This (fname)); i:=0;
- WHILE i < len DO
- ConvertCharToOberon (run[i]);
- Texts.Write (W, run[i]);
- INC (i)
- END;
- Macintosh.GetRun (run, len, fname)
- END;
- Texts.Append (scrap, W.buf); scrap.changed:=FALSE
- END
- END Import;
- PROCEDURE* Export;
- VAR R: Texts.Reader; run: ARRAY 1024 OF CHAR; ch: CHAR; len: INTEGER; fnt: Fonts.Font;
- BEGIN
- IF Macintosh.convertClip & scrap.changed THEN
- Texts.OpenReader (R, scrap, 0); Texts.Read (R, ch);
- WHILE ~R.eot DO
- run[0]:=ch; fnt:=R.fnt; len:=1; Texts.Read (R, ch);
- WHILE (~R.eot) & (R.fnt=fnt) & (len < 1024) DO
- ConvertCharFromOberon (ch); run[len]:=ch;
- Texts.Read (R, ch); INC (len)
- END;
- Macintosh.PutRun (run, len, fnt.name)
- END;
- Macintosh.PutScrap; scrap.changed:=FALSE
- END
- END Export;
- PROCEDURE* Notify (T: Texts.Text; op: INTEGER; beg, end: LONGINT);
- BEGIN
- T(Scrap).changed:=TRUE;
- TextFrames.NotifyDisplay (T, op, beg, end)
- END Notify;
- BEGIN
- Texts.OpenWriter (W); NEW (ClipB); Texts.OpenBuf (ClipB);
- NEW (scrap); scrap.notify:=Notify; Texts.Open (scrap, "");
- Macintosh.suspendQ.Add (Export); Kernel.quitQ.Add (Export);
- Macintosh.resumeQ.Add (Import);
- Macintosh.convertClip:=TRUE; Import
- END Clipboard.
-